//
//  CLViewController.h
//  CLBrowser
//
//  Created by chuck on 2021/7/8.
//

#import <UIKit/UIKit.h>
#import "CLNavigationController.h"
#import "CLBaseView.h"
#import "CLViewModel.h"
#import "CLFloatAlertView.h"
NS_ASSUME_NONNULL_BEGIN

@interface CLViewController : UIViewController <CLWebHiddenNavigationProtocol>

/// contentInset defaul is (64 , 0 , 0 , 0)
@property (nonatomic, assign) UIEdgeInsets contentInset;
// 方便标记
@property (nonatomic, assign) NSInteger vcType;
//第一层：用作背景
@property (nonatomic, strong) CLBaseView *backgroundView;
//第二层：承载大部分控件
@property (nonatomic, strong) CLBaseView *contentView;
//第三层：半屏控件容器，位于alertContainView之后
@property (nonatomic, strong) CLFloatAlertView *halfContainView;
//第四层：全屏控件容器，位于最高位置，低于 window
@property (nonatomic, strong) CLFloatAlertView *alertContainView;

/// The `viewModel` parameter in `-initWithViewModel:` method.
@property (nonatomic, readonly, strong) CLViewModel *viewModel;

/// 截图（Push/Pop Present/Dismiss 过度过程中的缩略图）
@property (nonatomic, readwrite, strong) UIView *snapshot;
/**
 统一使用该方法初始化，子类中直接声明对于的'readonly' 的 'viewModel'属性，
 并在@implementation内部加上关键词 '@dynamic viewModel;'
 @dynamic A相当于告诉编译器：“参数A的getter和setter方法并不在此处，
 而在其他地方实现了或者生成了，当你程序运行的时候你就知道了，
 所以别警告我了”这样程序在运行的时候，
 对应参数的getter和setter方法就会在其他地方去寻找，比如父类。
 */
/// Initialization method. This is the preferred way to create a new view.
///
/// viewModel - corresponding view model
///
/// Returns a new view.
- (instancetype)initWithViewModel:(CLViewModel *)viewModel;

/// Binds the corresponding view model to the view.(绑定数据模型)
- (void)bindViewModel;


- (void)initialize;

- (void)addSubviews;

- (void)addComplete;
@end

NS_ASSUME_NONNULL_END
